// pages/cart/index.js
import {
  getSetting,
  chooseAddress,
  openSetting,
  showModal,
  showToast
} from '../../utils/asyncWx'

Page({

  /**
   * 页面的初始数据
   */
  data: {
    address: {},
    cart: [],
    allChecked: false,
    totalPrice: 0,
    totalNum: 0
  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
    //获取缓存中的用户地址
    let address = wx.getStorageSync('address')
    let cart = wx.getStorageSync('cart') || []

    this.setData({
      address,
      cart
    })
    this.setCart(cart)
  },


  //获取用户地址
  handleChooseAddress() {
    getSetting()
      .then(val => {
        //获取权限状态
        const scopeAddress = val.authSetting['scope.address']
        //判断 权限状态
        if (scopeAddress === false) {
          openSetting()
        }
        chooseAddress().then(res => {
          let address = res
          address.all = address.provinceName + address.cityName + address.countyName + address.detailInfo;

          //把获取到的用户地址写入缓存中
          wx.setStorageSync('address', address)
        })
      })
  },

  //商品的选中状态
  handleItemChange(e) {
    //获取当前被修改的商品id
    let goods_id = e.currentTarget.dataset.id
    //获取购物车数组
    let {
      cart
    } = this.data
    //找到被修改的商品对象
    let index = cart.findIndex(item => item.goods_id === goods_id)
    //选中状态相反
    cart[index].checked = !cart[index].checked

    this.setCart(cart)
  },

  //设置购物车状态的同时 重新计算底部工具栏的 全选 总价格 结算数量
  setCart(cart) {
    //设置是否全选
    let allChecked = true
    // 总价格 总数量
    let totalPrice = 0
    let totalNum = 0
    // 遍历缓存中商品的数据
    cart.forEach(item => {
      //判断 遍历所有商品的 checked 是否都为 true 是：则计算总价和总数量
      if (item.checked) {
        totalPrice += item.num * item.goods_price
        totalNum += item.num
      } else {
        //有一个 false 则设置 allchecked 为false
        allChecked = false
      }
    });
    //判断商品数组是否为空
    allChecked = cart.length != 0 ? allChecked : false

    this.setData({
      cart,
      totalPrice,
      totalNum,
      allChecked
    })
    wx.setStorageSync('cart', cart)
  },

  //全选 反选
  handleItemAllCheck(e) {
    // 1、获取data 中的 allChecked cart
    let {
      cart,
      allChecked
    } = this.data
    // 2、allChecked 取反
    allChecked = !allChecked
    // 3、遍历商品数组，把里面的 checked 都因 allChecked 改变而改变
    cart.forEach(item => item.checked = allChecked)
    //重新放回缓存并计算总价 总数量
    this.setCart(cart)
  },

  //商品数量的编辑功能
  handleItemNumEdit(e) {
    // 1、解构 事件源 获取要修改的商品id和属性
    let {id,operation} = e.currentTarget.dataset
    // 2、获取商品数据
    let {cart} = this.data
    // 3、遍历数组把id对应的对象
    let index = cart.findIndex(item => item.goods_id == id)
    // 4、判断num值是否为 1 并 operation 为 -1 如果是则执行弹窗是否要删除
    if (cart[index].num === 1 && operation === -1) {
      showModal({content: '您是否要删除？'}).then(val => {
        if (val.confirm) {
          cart.splice(index, 1)
          this.setCart(cart)
        }
      })
    }else {
      cart[index].num += operation
      // 5、把数据重新放回缓存
      this.setCart(cart)
    }

  },

  //结算按钮
  handlePay() {
    // 1、判断地址是否获取到
    let {address,totalNum} = this.data
    if(!address.userName)  {
      showToast({title: '没有收货地址'})
      return;
    }
    // 2、判断是否有商品 
    if(totalNum === 0) {
      showToast({title: '没有可购买的商品'})
      return
    }
    // 3、跳转到支付页面
    wx.navigateTo({
      url: '/pages/pay/index',
    })

  }

})